﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskDemo
{
    /*
    Task:
    基于Thread+ThreadPool结合

    Task三种启动方法的比较
    【1】Task对象的Start方法启动，适合在符合条件的情况下去启动，也就是可以按照需求启动，灵活控制.
    【2】Run方法，是定义后直接启动。适合马上启动的情况
    【3】Factory.StartNew，也是直接启动线程
     */
    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Test2();
            Test3();
            Console.ReadLine();
        }
        //【1】创建Task对象，然后调用Start()方法启动线程
        static void Test1()
        {
            Task task = new Task(() =>
            {
                //在这个地方编写需要的具体任务...

                Console.WriteLine("new一个新的Task，对应的子线程ID="+Thread.CurrentThread.ManagedThreadId);
            });
            task.Start();
        }

        //【2】使用Task的静态方法Run直接启动线程
        static void Test2()
        {
            Task task = Task.Run(() =>
            {
                //在这个地方编写需要的具体任务...

                Console.WriteLine("使用Task中的Run方法，对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
            });
        }

        //【3】使用Factory启动
        static void Test3()
        {
            Task task = Task.Factory.StartNew(() =>
            {
                //在这个地方编写需要的具体任务...

                Console.WriteLine("使用Task中的Factory.StartNew方法，对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
            });
        }
    }
}
